<?php
/**
 * Класс Main
 *
 * Главный класс программы.
 * Используется в файле запуска парсера из командной строки (index.php).
 * Проверяет корректность задания параметров.
 * Парсит страницу в интернете.
 * Сохраняет данные в базе.
 *
 * @author Овчарик Игорь Николаевич <oiliss@bk.ru>
 * @version 0.1
 */


class Main
{
    /**
     * @var string адрес сайта
     */
    private $urlStr;
    /**
     * @var string строка поискового запроса
     */
    private $searchStr;
    /**
     * @var string специальная стркоа запроса для сайта rozetka.com.ua
     */
    private $rozetkaUrlStr;
    /**
     * @var array( array( "name", "model", "price", "link") ) массив выбранных данных
     */
    private $data;

    /**
     * Callback-функция для сортировки выбранного со страницы массмва данных
     * Сортировка по возрастанию цены.
     *
     * @param array( "name", "model", "price", "link") $a первый элемент
     * @param array( "name", "model", "price", "link") $b второй элемент
     * @return integer результат сравнения
     */
    static function dataSortCbFunction( $a, $b )
    {
        if ( $a[ "price" ] == $b[ "price" ] ) {
            return 0;
        }
        return ( $a[ "price" ] < $b[ "price" ] ) ? - 1 : 1;
    }

    /**
     * Обработка параметры командной строки.
     * При недостаточном количестве параметров завершение работы программы.
     *
     * @param integer $argc количество аргументов командной строки
     * @param array $argv массив аргументов командной строки
     * @return
     */
    public function getCommandLineParams( $argc, $argv )
    {
        if ( $argc <= Common::PARAM_COUNT ) {
            Log::write( "Ошибка! В параметрах командной строки нужно указать адрес сайта и строку поискового запроса" );
            exit( 1 );
        }
        $this->urlStr = $argv[ 1 ];
        $scheme       = "http://";
        if ( strpos( $this->urlStr, $scheme ) == false ) {
            $this->urlStr = $scheme . $this->urlStr;
        }
        Log::write( "Адрес сайта: " . $this->urlStr );
        $this->searchStr     = $argv[ 2 ];
        $searchStr           = urlencode( iconv( Common::INPUT_CODE_PAGE, Common::WEB_CODE_PAGE, $this->searchStr ) );
        $this->rozetkaUrlStr = rtrim( $this->urlStr, "/" ) .
            "/search/?section=%2F&text=" . $searchStr;
        Log::write( "Сформированный запрос к сайту: " . $this->rozetkaUrlStr );
    }

    /**
     * Получение данных из интернета.
     * Данные возвращаются в виде ассоциативного массива.
     *
     * Модель изделия входит составной частью в название,
     * поэтому в качестве модели выбирается уникальный номер изделия.
     *
     * @return
     */
    public function getDataFromPage()
    {
        $this->data = array();
        $http       = new Http();
        $page       = $http->getPage( $this->rozetkaUrlStr );
        $html       = str_get_html( $page );
        foreach ( $html->find( ".item" ) as $element ) {
            $model         = explode( " ", trim( $element->plaintext ) )[ 0 ];
            $title         = $element->find( ".title", 0 );
            $link          = $title->find( "a", 0 );
            $price         = explode( " ", $element->find( ".uah", 0 )->plaintext )[ 0 ];
            $this->data[ ] = array( "name"  => trim( $title->plaintext ),
                                    "model" => $model,
                                    "price" => $price,
                                    "link"  => $link->href
            );
        }

        usort( $this->data, array( "Main", "dataSortCbFunction" ) );
    }

    /**
     * Записываем данные в базу.
     *
     * @param integer $argc количество аргументов командной строки
     * @param array $argv массив аргументов командной строки
     * @return
     */
    public function saveDataToDB()
    {
        DB::save( $this->data, $this->rozetkaUrlStr, Common::$currentDateTime );
    }

}